package com.grt192.core;

import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;

import com.grt192.networking.GRTClientSocket;
import com.grt192.networking.SocketEvent;
import com.grt192.networking.SocketListener;

import java.util.Vector;

public class RobotModel implements SocketListener {
	public static final String HOST = "10.1.92.2";
	public static final int PORT = 1234;

	private GRTClientSocket socket;
	protected double x;
	protected double y;
	protected double heading;
	protected boolean armExtended;
	protected boolean firing;
	protected boolean readyToFire;
	protected Vector<RobotModelListener> listeners;

	public RobotModel() {
		this.x = 0;
		this.y = 0;
		this.heading = 0;
		this.armExtended = false;
		this.firing = false;
		this.readyToFire = false;
		this.socket = new GRTClientSocket(HOST, PORT);
		socket.start();
		listeners = new Vector<RobotModelListener>();
	}

	public void addRobotModelListener(RobotModelListener rml) {
		listeners.add(rml);
	}

	public void moveTo(double r, double theta, double s) {
		JSONObject json = new JSONObject();
		try {
			json.put("command", "moveto");
			json.put("r", "" + r);
			json.put("theta", "" + theta);
			json.put("s", "" + s);
			socket.sendData(json.toString());
		} catch (JSONException e) {
			e.printStackTrace();
		}

	}

	public void stop() {
		JSONObject json = new JSONObject();
		try {
			json.put("command", "stop");
			socket.sendData(json.toString());
		} catch (JSONException e) {
			e.printStackTrace();
		}
	}

	public void fire() {
		JSONObject json = new JSONObject();
		try {
			json.put("command", "fire");
			socket.sendData(json.toString());
		} catch (JSONException e) {
			e.printStackTrace();
		}

	}

	public void toggleArm() {
		JSONObject json = new JSONObject();
		try {
			json.put("command", "arm");
			socket.sendData(json.toString());
		} catch (JSONException e) {
			e.printStackTrace();
		}

	}

	public void getStatus() {
		JSONObject json = new JSONObject();
		try {
			json.put("command", "getstatus");
			socket.sendData(json.toString());
		} catch (JSONException e) {
			e.printStackTrace();
		}
	}

	@Override
	public void dataRecieved(SocketEvent e) {
		try {
			JSONObject json = new JSONObject(new JSONTokener(e.getData()));
			x = Double.parseDouble(json.getString("x"));
			y = Double.parseDouble(json.getString("y"));
			heading = Double.parseDouble(json.getString("heading"));
			armExtended = json.getBoolean("arm");
			firing = json.getBoolean("firing");
			readyToFire = json.getBoolean("ready");
			notifyListeners();
		} catch (JSONException e1) {
			e1.printStackTrace();
		}
	}

	@Override
	public void onConnect(SocketEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void onDisconnect(SocketEvent e) {
		// TODO Auto-generated method stub

	}

	public double getX() {
		return x;
	}

	public double getY() {
		return y;
	}

	public double getHeading() {
		return heading;
	}

	public boolean isArmExtended() {
		return armExtended;
	}

	public boolean isFiring() {
		return firing;
	}

	public boolean isReadyToFire() {
		return readyToFire;
	}

	protected void notifyListeners() {
		for (RobotModelListener rml : listeners) {
			rml.stateChanged();
		}
	}

	public void removeRobotModelListener(RobotModelListener l){
		listeners.remove(l);
	}
	
}
